package com.gitee.l0km.aocache;

import java.lang.reflect.Member;
import com.gitee.l0km.aocache.config.CacheConfig;
import com.gitee.l0km.aocache.config.CacheConfigSupplier;
import com.gitee.l0km.aocache.config.ConcurrentMapCacheConfigSupplier;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;


/**
 * 运行时缓存配置供应商类，继承自 {@link ConcurrentMapCacheConfigSupplier。} <p>
 * 该类用于在运行时提供缓存配置，通过SPI加载所有实现了 {@link CacheConfigSupplier} 接口的服务提供者，<br>
 * 并根据输入的成员和目标对象查找合适的缓存配置。<p>
 */
class RuntimeCacheConfigSupplier extends ConcurrentMapCacheConfigSupplier {

	private static final List<CacheConfigSupplier> LOADED_CACHE_CONFIG_SUPPLIERS = loadCacheConfigSuppliers();

	RuntimeCacheConfigSupplier() {
		super();
	}

	@Override
	public CacheConfig configOf(Member input, Object target) {
		if (null == input) {
			return null;
		}
		CacheConfig config = super.configOf(input, target);
		if (null == config) {
			MemberKey key = MemberKey.of(input, target);
			for (CacheConfigSupplier cacheConfigSupplier : LOADED_CACHE_CONFIG_SUPPLIERS) {
				config = cacheConfigSupplier.configOf(key.member, key.target);
				if (null != config) {
					configs.putIfAbsent(key, config);
					break;
				}
			}
		}
		return config;
	}

	boolean containsKey(MemberKey key) {
		if (null == key) {
			return false;
		}
		return configs.containsKey(key);
	}

	/**
     * 加载所有实现了 CacheConfigSupplier 接口的服务提供者。
     * <p>
     * 该方法使用 Java 的 ServiceLoader 机制来发现并加载所有在类路径下
     * 声明的 CacheConfigSupplier 实现类。
     * <p>
     * @return 包含所有加载的 CacheConfigSupplier 实例的列表。
     */
    private static List<CacheConfigSupplier> loadCacheConfigSuppliers() {
        List<CacheConfigSupplier> suppliers = new ArrayList<>();
        ServiceLoader<CacheConfigSupplier> loader = ServiceLoader.load(CacheConfigSupplier.class);
        for (CacheConfigSupplier supplier : loader) {
            suppliers.add(supplier);
        }
        return suppliers;
    }

}

